package com.mc.queue;

import java.util.ArrayList;
import java.util.LinkedList;

/**
 * @Description: 顺序队列
 * @Author: MoChen
 */
public class HSqQueue{

    private static class SqQueue{
        private final int MAX_SIZE = 10;
        int[] data; // 静态数组存放元素
        int front, rear; // 队头指针和队尾指针

        public SqQueue(){
            data = new int[MAX_SIZE];
        }
    }

    private SqQueue Q;

    // 初始化队列
    void initQueue(){
        Q = new SqQueue();
        Q.front = Q.rear = 0; // 初始时，队头队尾全部指向空
    }

    // 判断队列是否为空
    boolean queueEmpty(){
        return Q.front == Q.rear; // 当队头队尾指向一样时，则意味队列为空
    }

    // 入队
    boolean enQueue(int x){
        if((Q.rear + 1) % Q.MAX_SIZE == Q.front){ // 如果队头的指针的下一位指向队尾，则表示队满
            System.out.println("当前队列已满，无法入队");
            return false;
        }
        Q.data[Q.rear] = x;
        Q.rear = (Q.rear + 1) % Q.MAX_SIZE; // 队尾指针+1取模，保证指针不会超过长度
        return true;
    }

    // 出队
    boolean deQueue(){
        if(Q.front == Q.rear){ // 队列为空
            return false;
        }
        Q.data[Q.front] = -1;
        Q.front = (Q.rear + 1) % Q.MAX_SIZE; // 队尾指针+1取模，保证指针不会超过长度
        return true;
    }

    // 获取队头元素
    int getHead(){
        if(Q.front == Q.rear){ // 队列为空
            return -1;
        }
        int x = Q.data[Q.front];
        return x;
    }

    // 获取队列长度
    int queueLength(){
        return (Q.rear + Q.MAX_SIZE - Q.front) % Q.MAX_SIZE;
    }
}
